package com.ehsy.service;

import com.dtflys.forest.annotation.*;
import com.dtflys.forest.backend.httpclient.HttpClient;
import com.dtflys.forest.backend.okhttp3.OkHttp3;
import com.ehsy.common.ResponseVo;
import com.ehsy.model.MyHttpClientProvider;
import com.ehsy.model.MyOkHttpClientProvider;
import com.ehsy.model.UserInfo;
import org.springframework.stereotype.Component;

/**
 * @author YanZhen_Li
 * @version 1.0
 * @title BackendService
 * @description
 * @create 2024/6/18 10:26
 */
@Component
@Address(host = "127.0.0.1", port = "8080")
public interface BackendService {
    /**
     * 绑定请求的后端为 httpclient
     */
    @Get("/test/request/json/body")
    @HttpClient // 我们的这个注解可以添加到我们的接口类上，这样的话我们整个接口就都是这种请求了
    ResponseVo<UserInfo> test1(@Query UserInfo user);

    /**
     * 绑定请求的后端为 okhttp3
     */
    @Get("/test/request/json/body")
    @OkHttp3 // 我们的这个注解可以添加到我们的接口类上，这样的话我们整个接口就都是这种请求了
    ResponseVo<UserInfo> test2(@Query UserInfo user);

    /**
     * 绑定请求的后端为 httpclient
     */
    @Get("/test/request/json/body")
    @Backend("httpclient") // 我们的这个注解可以添加到我们的接口类上，这样的话我们整个接口就都是这种请求了
    ResponseVo<UserInfo> test3(@Query UserInfo user);

    /**
     * 绑定请求的后端为 okhttp3
     */
    @Get("/test/request/json/body")
    @Backend("okhttp3") // 我们的这个注解可以添加到我们的接口类上，这样的话我们整个接口就都是这种请求了
    ResponseVo<UserInfo> test4(@Query UserInfo user);

    /**
     * 根据请求参数获取请求方式
     */
    @Get("/test/request/json/body")
    @Backend("{0}") // 我们的这个注解可以添加到我们的接口类上，这样的话我们整个接口就都是这种请求了
    ResponseVo<UserInfo> test5(String backend, @Query UserInfo user);

    /**
     * 自定义Client
     */
    @Get("/test/request/json/body")
    @OkHttp3(client = MyOkHttpClientProvider.class)
    ResponseVo<UserInfo> test6(@Query UserInfo user);

    @Get("/test/request/json/body")
    @HttpClient(client = MyHttpClientProvider.class)
    ResponseVo<UserInfo> test7(@Query UserInfo user);

    /**
     * 如果您不想让某个方法的请求的 Client 实例由 Forest 的缓存来管理，也可以使用@BackendClient注解来打开/关闭其缓存。
     */
    @Get("/test/request/json/body")
    @BackendClient(cache = false)
    ResponseVo<UserInfo> test8(@Query UserInfo user);
}
